package cn.jsj.onclock.dao;

import cn.jsj.onclock.pojo.GroupEnt;
import cn.jsj.onclock.pojo.UserGroupInfo;
import cn.jsj.onclock.pojo.identity.GroupIdentityEnum;
import cn.jsj.onclock.pojo.identity.GroupJoinAuthEnum;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;

/**
 * @author 卢斌
 */
@Mapper
public interface GroupDao {


    /**
     * id查询某一群组
     *
     * @param groupId   群组Id
     * @return  该群组信息
     */
    GroupEnt getGroupById(@Param("groupId") Long groupId);



    /**
     * 创建群
     *
     * @param groupEnt  群实体（仅群名称和建群者信息有效）
     */
    void insertOneGroup(GroupEnt groupEnt);


    /**
     * 更新群组信息, 无法更新群组负责人信息
     *
     * @param groupEnt  群组实体
     * @return  数据库影响条数
     */
    Integer update(GroupEnt groupEnt);


    /**
     * 更改群名称
     *
     * @param groupId   群Id
     * @param groupName 群新名称
     */
    void updateGroupName(@Param("groupId") Long groupId, @Param("groupName") String groupName);



    /**
     * 用户加入群组
     *
     * @param groupId   目标群组
     * @param userId    用户Id
     * @param identity  加群身份
     * @return  数据库影响条数
     */
    Integer insertUserToGroup(@Param("groupId") Long groupId, @Param("userId") Long userId, @Param("identity") GroupIdentityEnum identity);


    /**
     * 查询群组内所有用户的群信息（带有用户信息）
     *
     * @param groupId   群组Id
     * @return  群组内所有用户群信息
     */
    List<UserGroupInfo> listUserJoinGroupInfoWithUser(@Param("groupId") Long groupId);


    /**
     * 查询群组内所有成员的用户Id列表
     *
     * @param groupId   群组Id
     * @return  群内所有成员的Id列表
     */
    List<Long> listAllUserIdInGroup(@Param("groupId") Long groupId);


    /**
     * 获取用户加群信息, 检查用户是否在群组内
     *
     * @param groupId   群组id
     * @param userId    用户Id
     * @return  用户群信息
     */
    UserGroupInfo getUserJoinGroupInfo(@Param("groupId") Long groupId, @Param("userId") Long userId);


    /**
     * 检查用户是否在群组中
     *
     * @param userId    用户Id
     * @param groupId   群组Id
     * @return  用户是否在群组中
     */
    Boolean userIsInGroup(@Param("userId") Long userId, @Param("groupId") Long groupId);


    /**
     * 获取用户加群信息（带有群组信息）
     *
     * @param groupId   群组Id
     * @param userId    用户Id
     * @return  携带群组信息的用户加群信息
     */
    UserGroupInfo getUserJoinGroupInfoWithGroupEnt(@Param("groupId") Long groupId, @Param("userId") Long userId);


    /**
     * 查询用户加入的所有群组信息（带有群组信息）
     *
     * @param userId    用户Id
     * @return  用户相关的群组信息
     */
    List<UserGroupInfo> listUserGroupInfoAboutUser(@Param("userId") Long userId);


    /**
     * 前缀名称模糊查询用户已经加入的群组
     *
     * @param userId    用户Id
     * @param prefix    前缀名称
     * @return  用户加入的并且符合前缀的群组
     */
    List<UserGroupInfo> listUserGroupInfoLikeGroupName(@Param("userId") Long userId, @Param("prefix") String prefix);


    /**
     * 删除一个群组信息
     *
     * @param groupId   群组Id
     * @return  数据库删除数量
     */
    Integer deleteGroup(@Param("groupId") Long groupId);


    /**
     * 删除数据库的成员信息
     *
     * @param groupId   群组Id
     * @return  数据库删除数量
     */
    Integer deleteJoinGroupInfo(@Param("groupId") Long groupId);


    /**
     * 查询前缀名称的群组列表
     *
     * @param groupName 群组名称前缀
     * @return  符合前缀规则的群组列表
     */
    List<GroupEnt> listLikeName(@Param("groupName") String groupName);


    /**
     * 更新群组默认审批方式
     *
     * @param authEnum  默认审批方式
     * @param groupId   群组Id
     * @return 数据库影响条数
     */
    Integer updateGroupRequestAuthWay(@Param("authEnum") GroupJoinAuthEnum authEnum, @Param("groupId") Long groupId);


}
